← All Articles

[React] HOOK

Posted on

HOOK

리액트는 함수형 컴포넌트와 클래스형 컴포넌트를 모두 지원한다.

HOOK은 함수형 컴포넌트에서 사용되는 기능이다.

우리는 HOOK을 배우기 전 함수형 컴포넌트와 클래스형 컴포넌트의 차이점을 알고 넘어가야 이해가 쉬울 것이다.


함수형 컴포넌트

  • 명령형이 아닌 선언형
  • 애플리케이션 상태를 순수 함수를 통해 전달함.
  • 객체 지향 프로그래밍과 대조적임.
  • 함수형 컴포넌트는 클래스형 컴포넌트에 비해 선언하기가 좀 더 편하고 메모리 자원을 덜 사용하는 장점이 있음

클래스형 컴포넌트

  • 상태를 저장할 수 있고, Life Cycle Method를 사용할 수 있음
  • render() 함수가 필수적을 필요함
  • state와 action을 분리하기 어려움

함수형 컴포넌트와 클래스형 컴포넌트 둘 사이에는 차이점이 존재하나, 어느 하나가 더 낫다고 판단하기에는 어렵다.

그래서 두 방식의 컴포넌트를 모두 익혀둘 필요가 있다고 나는 생각한다.

그 중 함수형 컴포넌트를 사용하기 위해선 HOOK을 충분히 익힐 필요가 있다.


HOOK이란?

함수형 컴포넌트에서 클래스형 컴포넌트에 사용되는 state, life-cycle과 같은 기능을 사용할 수 있도록 도움을 주는 기능.

HOOK은 클래스형 컴포넌트에서는 동작하지 않음.

(이미 특정 형태로 짜놓은 코드를 다른 형태의 컴포넌트로 바꾸고 HOOK을 사용하는 행위들은 불필요한 행동이다.)


useState

  • 클래스형 컴포넌트에서 사용되는 state 속성을 사용하기 위한 기능이다.
  • 클래스형 컴포넌트에서는 this.setState()를 사용하여 state의 값을 변화시키는 것에 반해 함수형 컴포넌트에서는 useState를 사용한다.
  • 자세한 사용방법은 다음 코드와 같다.
import React, { useState } from 'react'

const FunctionalComponent = (props) => {
    const [count, setCount] = useState(0);  // useState 사용방식

    const onClickMethod = () => {
        setCount(count + 1);
    }

    return (
        <div>
            <h1>this is FunctionalComponent</h1>
            <h2>User name : {props.name}</h2>
            <h2>User age : {props.age}</h2>
            <button onClick={onClickMethod}>{count}</button>
        </div>
    )
}

export default FunctionalComponent

본 코드에서는 우선 함수형 컴포넌트이기 때문에 render() 함수가 사용되지 않은 것을 볼 수 있다.

또한 constructor()와 같은 코드가 없어져 코드가 훨씬 간편화 되었으며 state 사용 자체도 굉장히 간편하게 변한 것을 볼 수 있다.

useState의 경우 [state 이름, setState 함수] 식으로 선언하고 useState() 괄호안에 있는 수로 state가 초기화 된다.

또한 여러 state를 한 함수에 정의할 수도 있다. → 각 state들은 구별을 분명히 하기 위해 적절한 naming이 필요함.


useEffect

useEffect는 쉽게 말하면 클래스형 컴포넌트에 존재하는 life-cycle 함수들을 대체하는 기능을 제공한다.

클래스형컴포넌트 함수에는 첫 마운트 후 작업 기능을 제공하는 componentDidMount(), 컴포넌트 수정 후 작업하는 componentDidUpdate() 등의 life-cycle 함수들이 존재한다.

useEffect Hook은 리액트에게 컴포넌트가 렌더링 이후에 어떤 일을 수행해야 하는지를 가르쳐주는 역할을 수행하며 기존의 life-cycle 함수들과 유사한 것을 볼 수 있다.

useEffect 훅은 렌더링 이후 매번 수행된다. 마운팅과 업데이트로 나누어 생각하는 것 보다 렌더링 이후 발생한다고 생각하면 이해가 편하다.

리액트는 effect가 수행되는 시점에 이미 DOM이 업데이트되었음을 보장한다.

import React, { useState, useEffect } from 'react'

const FunctionalComponent = (props) => {
    const [count, setCount] = useState(0);
    const [doublecount, setDoublecount] = useState(0);
    const [timer, setTimer] = useState(0);

    const onClickMethod = () => {
        setCount(count + 1);
    }

    const onDoubleMethod = () => {
        setDoublecount(doublecount + 2);
    }

    useEffect(() => {
        if (timer < 10)
            setTimeout(() => {
                setTimer(timer + 1);
            }, 1000)
    })

    return (
        <div>
            <h1>this is FunctionalComponent</h1>
            <h2>User name : {props.name}</h2>
            <h2>User age : {props.age}</h2>
            <button onClick={onClickMethod}>{count}</button>
            <button onClick={onDoubleMethod}>{doublecount}</button>
            <div>Time : {timer}...  (0~10)</div>
        </div>
    )
}

export default FunctionalComponent

본 코드는 useEffect를 활용하여 간단하게 0~10초간 타이머를 만든 코드이다. useEffect의 경우 렌더링 후 지속적으로 호출되기 때문에 life-cycle에서 구현한 타이머와 동일한 기능을 코딩할 수 있다.

WebReactFront-end